package model;

import java.io.ByteArrayOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

/**
 * Classe qui envoie le son du micro aux conversations actives
 * @author Lefevre, Thoue
 */
public class EmetteurUDP extends Thread {

    private boolean running = true;
    final static int taille = 640;
    private Manager manager;

    /**
     * Constructeur
     * @param manager gestionnaire des threads
     */
    public EmetteurUDP(Manager manager) {
        running = true;
        this.manager = manager;
    }

    /**
     * Methode principal du thread -
     * Capture le son du micro et le diffuse sous forme de paquets UDP.
     */
    @Override
    public void run() {
        Logger.getLogger(Serveur.class.getName()).log(Level.INFO, "Serveur:Conversation UDP demarrÃ©.");
        try {
            DatagramSocket socket = new DatagramSocket();
            final AudioFormat format = new AudioFormat(16000, 16, 1, true, true);
            DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
            final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
            line.open(format);
            line.start();
            byte buffer[] = new byte[taille];
            while (running) {
                DatagramPacket envoi = null;
                line.read(buffer, 0, buffer.length);
                //gestion des silences
                int max = 0;
                for (int i = 0; i < taille; i++) {
                    max = max + Math.abs(buffer[i]);
                }
                float moyenne = (float) max / taille;
                manager.getModel().setActualVoiceLevel((int) moyenne); //avertir la vue du niveau de voix
                if (moyenne > manager.getModel().getSeuilSilence()) {
                    for (Conversation client : manager.getServeur().getConversations()) {
                        if (client.getStatus() == EStatusConversation.ETABLISH) {
                            envoi = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(client.getUser().getIp()), 2013);
                            socket.send(envoi);
                        }
                    }
                    Thread.sleep(20);  //temporise l'emission pour avoir une vitese de 20ms                      
                }

            }
        } catch (IllegalArgumentException il) {
            Logger.getLogger(Conversation.class.getName()).log(Level.SEVERE, "Aucun micro detecté.");
        } catch (Exception ex) {
            Logger.getLogger(Conversation.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
